package com.pos.toolbox;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @description:金融类相关通用方法
 * @author cai
 * @time:2014年12月17日上午10:43:10
 */
public class FinancialUtils {
	public static DecimalFormat df = new DecimalFormat("0.00");

	/**
	 * 规格化金额 0.00
	 */
	public static String sumFomat(Double data) {
		BigDecimal bd = new BigDecimal(data);
		BigDecimal setScale = bd.setScale(2, bd.ROUND_DOWN);
		try {
			return df.format(setScale);
		} catch (Exception e) {
			e.printStackTrace();
			return "0.00";
		}
	}

	/**
	 * 将long类型分转化为规格化的String类型元
	 */
	public static String fenToYuan(long fen) {
		if (fen == 0) {
			return "0.00";
		}
		return df.format(Double.valueOf(fen + "") / 100);
	}

	/**
	 * 将String类型元转化为 long类型分
	 */
	public static long yuanToFen(String yuan) {
		// return (long) (Double.valueOf(yuan) * 100);
		return Long.valueOf(toNormalNumber(yuan).replace(".", ""));
	}

	/**
	 * 将String类型任意格式（单位元）转化为格式化的金额（0.00形式）,不会产生近似舍入问题
	 */
	public static String toNormalNumber(String numString) {
		if (numString.equals("") || numString == null || numString.equals(".")) {
			return "0.00";
		} else {
			try {
				numString = String.valueOf(Double.valueOf(numString));
			} catch (NumberFormatException e) {
				return "0.00";
			}
			int i = numString.indexOf(".");
			int j = numString.length();
			if (i != -1) {
				if (i == 0) {
					if (j == (i + 2)) {
						return "0" + numString + "0";
					} else {
						return "0" + numString.substring(0, 3);
					}
				} else {
					if (j == (i + 2)) {
						return numString + "0";
					} else if (j == (i + 1)) {
						return numString + "00";
					} else {
						return numString.substring(0, i + 3);
					}
				}
			} else {
				return numString + ".00";
			}

		}
	}

	/**
	 * @Method : fen2yuan
	 * @Description: 单位转换:分转元
	 * @param money
	 * @return
	 */
	public static String fen2yuan(long money) {
		BigDecimal bigMoney = new BigDecimal(String.valueOf(money));
		BigDecimal feedRate = new BigDecimal("100");
		String returnStr = String.valueOf(bigMoney.divide(feedRate).setScale(2));
		if (returnStr.indexOf(".") > 0) {
			// 正则表达
			returnStr = returnStr.replaceAll("0+?$", "");// 去掉后面无用的零
			returnStr = returnStr.replaceAll("[.]$", "");// 如小数点后面全是零则去掉小数点
		} 

		return toNormalNumber(returnStr);
	}

	/**
	 * @Method : yuan2fen
	 * @Description: 单位转换:元转分
	 * @param money
	 * @return
	 */
	public static String yuan2fen(String money) {
		String returnMoney = "";
		if (isNumber(money)) {
			BigDecimal feedRate = new BigDecimal(100);
			returnMoney = new BigDecimal(money).multiply(feedRate).setScale(0).toString();
		}
		return returnMoney;
	}

	/**
	 * @Method : isNumber
	 * @Description: 判断是否为金额
	 * @param str
	 * @return
	 */
	public static boolean isNumber(String str) {
		java.util.regex.Pattern pattern = java.util.regex.Pattern
				.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$"); // 判断小数点后2位的数字的正则表达式
		java.util.regex.Matcher match = pattern.matcher(str);
		return match.matches();
	}

}
